package ooday03;

public class PolymorphicDemo {
    public static void main(String[] args) {
        //1.演示向上造型：父类（接口）引用指向子类对象
        /*
        Dog d1=new Dog();//狗是狗
        //d1是Dog类型，所以可以点 Dog 的所有属性和方法
        //d1.name/age/color/eat()/drink()/lookHome()/swim();
        Animal a1=new Dog();//狗是动物
        //a1是Animal类型，所以可以点 Animal 的所有属性和方法
        //a1.name/age/color/eat/drink;
        Swim s1=new Dog();//狗会游泳
        //s1是Swim类型，所以可以点 swim
        //s1.swim();
         */

        //1.向上造型（多态）的应用
        /*
        Master master=new Master();
        Animal dog=new Dog();
        Animal chick=new Chick();
        Animal fish=new Fish();
        master.feed(dog);
        master.feed(chick);
        master.feed(fish);
        */
        /*
        Master master=new Master();
        Dog dog=new Dog("小白",2,"白");
        Chick chick=new Chick("小黄",1,"黄");
        Fish fish=new Fish("小红",2,"红");
        master.feed(dog);//在传参的同时，系统自动向上转型
        master.feed(chick);
        master.feed(fish);
        System.out.println("-------------------------------------------");
        */
        //实例化animal数组对象
        Animal[] animals=new Animal[3];
        //向上造型（前父后子）
        animals[0]=new Dog("旺财",2,"白");
        animals[1]=new Chick("小鸡",1,"白");
        animals[2]=new Fish("小花鱼",1,"黄");
        //遍历所有动物
        for(int i=0;i< animals.length;i++) {
            System.out.println(animals[i].name);//只能点出父类的属性和方法
            animals[i].eat();
            animals[i].drink();
            //狗能看家/游泳，小鸡下蛋，鱼游泳
            if(animals[i] instanceof Dog){
                Dog dog=(Dog) animals[i];//向下造型
                dog.lookHome();
            }
            if(animals[i] instanceof Chick){
                Chick chick=(Chick) animals[i];
                chick.layEggs();
            }
            if(animals[i] instanceof Swim){//适用于所有实现Swim接口的（会游泳的）
                Swim s=(Swim) animals[i];
                s.swim();
            }
        }




        //向下造型（发生强转）：
        //强转成功的条件：1.子类对象 2.父类引用指向子类对象
        //instanceof：判断一个对象是否是某个类的实例（子类）
        /*
        Animal a=new Dog("旺财",2,"白");
        if(a instanceof Dog){
            Fish fish=(Fish) a;//强转
        }else {
            System.out.println("a不是Fish类型");
        }
         */
    }
}




//1.建类  子类继承父类 有所有共有的属性和行为放父类，自己特有的放子类，部分共有的放接口
//子类继承父类，实现接口
//在类中，有属性  方法  构造方法(this)  方法重载（有参无参）
//抽象方法，有抽象方法的类是抽象类
//子类会继承父类的抽象方法   抽象方法不能实例化，所以要 方法的重写
//
//2.建对象，父类引用指向子类对象，实现接口


